home *** CD-ROM | disk | FTP | other *** search
/ Aminet 7 / Aminet 7 - August 1995.iso / Aminet / misc / sci / RARS_Amiga_3.lha / RARS / gi.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-27  |  5.4 KB  |  269 lines

  1. /*
  2.  * $RCSfile: gi.cpp $
  3.  *
  4.  * $Author: marcel $
  5.  *
  6.  * $Revision: 1.8 $
  7.  *
  8.  * $Date: 1995/05/15 10:51:12 $
  9.  *
  10.  * $Locker: marcel $
  11.  *
  12.  * $State: Exp $
  13.  *
  14.  * Amiga version
  15.  *
  16.  * Copyright © 1995 Marcel Offermans
  17.  *
  18.  * tabsize = 5
  19.  */
  20.  
  21. /* includes */
  22. #include <exec/types.h>
  23. #include <proto/graphics.h>
  24. #include <proto/intuition.h>
  25. #include <proto/diskfont.h>
  26. #include <proto/asl.h>
  27. #include <graphics/gfxmacros.h>
  28. #include <string.h>
  29. #include <stdio.h>
  30. #include <stdlib.h>
  31. #include "gi.h"
  32.  
  33. /* prototypes */
  34. int round(double);
  35.  
  36. /* macros */
  37. #define RGB24(r,g,b) (r << 24),(g << 24),(b << 24)
  38.  
  39. /* size of the font in pixels: you can't change this without seriously messing up the display */
  40. const int                    CHR_HGT_PIX        = 10;
  41. const int                    CHR_WID_PIX        = 9;
  42.  
  43. /* globals */
  44. BOOL                        available            = FALSE;
  45. double                    SCALE;
  46. double                    CHR_HGT;
  47. double                    CHR_WID;
  48. static int                maxx, maxy;
  49. static int                tran_table[]        = {8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7};
  50. struct Screen *            screen_ptr        = NULL;
  51. struct Window *            window_ptr        = NULL;
  52. struct RastPort *            rp_ptr            = NULL;
  53. PLANEPTR                    plane_ptr            = NULL;
  54. USHORT                    areapattern_ptr[]    = {0x0000};
  55. struct TextAttr            textattr            = {"topaz.font", 8, FS_NORMAL, FPF_ROMFONT};
  56. struct TmpRas                tmpras;
  57. ULONG                    colortable[]        = {16L<<16 + 0,
  58.     RGB24(128, 128, 128),
  59.     RGB24(000, 000, 255),
  60.     RGB24(000, 255, 000),
  61.     RGB24(000, 255, 255),
  62.     RGB24(255, 000, 000),
  63.     RGB24(255, 000, 255),
  64.     RGB24(255, 255, 000),
  65.     RGB24(255, 255, 255),
  66.     RGB24(000, 000, 000),
  67.     RGB24(000, 000, 180),
  68.     RGB24(000, 180, 000),
  69.     RGB24(000, 180, 180),
  70.     RGB24(180, 000, 000),
  71.     RGB24(180, 000, 180),
  72.     RGB24(180, 180, 000),
  73.     RGB24(180, 180, 180),
  74.     0};
  75. struct colors            car_clrs[] = {
  76.     {oWHITE,        oWHITE},
  77.     {oRED,        oWHITE},
  78.     {oBLACK,        oYELLOW},
  79.     {oGREEN,        oWHITE},
  80.     {oWHITE,        oMAGENTA},
  81.     {oBLUE,        oBLUE},
  82.     {oBLUE,        oWHITE},
  83.     {oYELLOW,        oYELLOW},
  84.     {oRED,        oRED},
  85.     {oBROWN,        oCYAN},
  86.     {oCYAN,        oCYAN},
  87.     {oBLACK,        oLIGHTMAGENTA},
  88.     {oBLACK,        oBLACK},
  89.     {oGREEN,        oGREEN},
  90.     {oBROWN,        oYELLOW},
  91.     {oMAGENTA,    oLIGHTGREEN},
  92. };
  93.  
  94. /* closes the graphical display screen */
  95. void resume_normal_display(void)
  96. {
  97.     /* reset the available flag to suppress graphics output */
  98.     available = FALSE;
  99.  
  100.     if (plane_ptr)
  101.     {
  102.         FreeRaster(plane_ptr, window_ptr->Width, window_ptr->Height);
  103.         plane_ptr = NULL;
  104.     }
  105.     if (window_ptr)
  106.     {
  107.         CloseWindow(window_ptr);
  108.         window_ptr = NULL;
  109.     }
  110.     if (screen_ptr)
  111.     {
  112.         CloseScreen(screen_ptr);
  113.         screen_ptr = NULL;
  114.     }
  115. }
  116.  
  117. long xcon(double x)
  118. {
  119.    return((long)(round(x / SCALE)));
  120. }
  121.  
  122. long ycon(double y)
  123. {
  124.    return((long)(maxy - round(y / SCALE)));
  125. }
  126.  
  127. void draw_line(double x0, double y0, double x1, double y1)
  128. {
  129.     if (!available)
  130.     {
  131.         return;
  132.     }
  133.  
  134.     Move(rp_ptr, xcon(x0), ycon(y0));
  135.     Draw(rp_ptr, xcon(x1), ycon(y1));
  136. }
  137.  
  138. void rectangle(double ulx, double uly, double lrx, double lry)
  139. {
  140.     if (!available)
  141.     {
  142.         return;
  143.     }
  144.  
  145.     RectFill(rp_ptr, xcon(ulx), ycon(uly), xcon(lrx), ycon(lry));
  146. }
  147.  
  148. void set_color(int our_color)
  149. {
  150.     if (!available)
  151.     {
  152.         return;
  153.     }
  154.  
  155.     SetAPen(rp_ptr, tran_table[our_color]);
  156. }
  157.  
  158. void set_fill_color(int our_color)
  159. {
  160.     if (!available)
  161.     {
  162.         return;
  163.     }
  164.  
  165.     SetBPen(rp_ptr, tran_table[our_color]);
  166. }
  167.  
  168. void flood_fill(double X, double Y)
  169. {
  170.     if (!available)
  171.     {
  172.         return;
  173.     }
  174.  
  175.     Flood(rp_ptr, 1, xcon(X), ycon(Y));
  176. }
  177.  
  178. void text_output(double X, double Y, char *source)
  179. {
  180.     if (!available)
  181.     {
  182.         return;
  183.     }
  184.  
  185.     SetDrMd(rp_ptr, JAM1);
  186.     Move(rp_ptr, xcon(X), ycon(Y) + 6);
  187.     Text(rp_ptr, source, strlen(source));
  188.     SetDrMd(rp_ptr, JAM2);
  189. }
  190.  
  191. void initialize_graphics(void)
  192. {
  193.     /* open a screen */
  194.     if (screen_ptr = OpenScreenTags(NULL,
  195.         SA_Depth,            scrdepth,
  196.         SA_Width,            scrwidth,
  197.         SA_Height,        scrheight,
  198.         SA_DisplayID,        scrid,
  199.         SA_Overscan,        scroscantype,
  200.         SA_AutoScroll,        scrautoscroll,
  201.         SA_Type,            CUSTOMSCREEN | SCREENQUIET,
  202.         SA_ShowTitle,        FALSE,
  203.         SA_Colors32,        colortable,
  204.         SA_Font,            &textattr,
  205.         TAG_DONE))
  206.     {
  207.         if (window_ptr = OpenWindowTags(NULL,
  208.             WA_CustomScreen,    screen_ptr,
  209.             WA_Backdrop,        TRUE,
  210.             WA_Borderless,        TRUE,
  211.             WA_Activate,        TRUE,
  212.             WA_IDCMP,            IDCMP_VANILLAKEY,
  213.             TAG_DONE))
  214.         {
  215.             /* set the rastport pointer */
  216.             rp_ptr = window_ptr->RPort;
  217.  
  218.             /* try to allocate a bitplane for the flood filling operation */
  219.             if (plane_ptr = AllocRaster(window_ptr->Width, window_ptr->Height))
  220.             {
  221.                 InitTmpRas(&tmpras, plane_ptr, RASSIZE(window_ptr->Width, window_ptr->Height));
  222.                 rp_ptr->TmpRas = &tmpras;
  223.                 /* set up the patterns for the pens */
  224.  
  225.                 /* jam 2 colors onto the screen when drawing */
  226.                 SetDrMd(rp_ptr, JAM2);
  227.  
  228.                 /* set the area fill pattern */
  229.                 SetAfPt(rp_ptr, areapattern_ptr, 0);
  230.  
  231.                 /* set the pen that is used for lines and arcs to initial color */
  232.                 SetAPen(rp_ptr, 1);
  233.  
  234.                 /* set the pen that is used for filling areas to initial color */
  235.                 SetBPen(rp_ptr, 2);
  236.  
  237.                 /* set up some variables that are needed for the feet to pixel conversions */
  238.                 maxx = window_ptr->Width - 1;
  239.                 maxy = window_ptr->Height - 1;
  240.  
  241.                 /* determine the distance in feet that each pixel will represent */
  242.                 SCALE = X_MAX / (double)maxx;
  243.                 if (Y_MAX / (double)maxy > SCALE)
  244.                 {
  245.                     SCALE = Y_MAX / (double)maxy;
  246.                     X_MAX = maxx * SCALE;
  247.                 }
  248.                 else
  249.                 {
  250.                     Y_MAX = maxy * SCALE;
  251.                 }
  252.  
  253.                 /* compute character width and height in feet */
  254.                 CHR_HGT = CHR_HGT_PIX * SCALE;
  255.                 CHR_WID = CHR_WID_PIX * SCALE;
  256.  
  257.                 /* set the IDCMP bit mask */
  258.                 idcmpmask = 1L << window_ptr->UserPort->mp_SigBit;
  259.  
  260.                 /* add an exit trap which cleans up this screen and window */
  261.                 atexit(resume_normal_display);
  262.  
  263.                 /* set the available flag so the GI knows it can draw */
  264.                 available = TRUE;
  265.             }
  266.         }
  267.     }
  268. }
  269.